<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 什么是闭包？
    // 闭包是一个函数可以访问已经销毁作用域中变量的函数。
    // 闭包：是一个函数以及其捆绑周边环境的引用。内部函数可以访问外部函数的变量。
    // 闭包表现形式：
    // 一个函数 M 中声明了一个变量 i,函数 M  返回了一个匿名函数 N，匿名函数 N 有对变量 i 的引用
    // 导致 M 运行完成后，由于 N 持有对 i 的引用，i 不能被垃圾回收机制 回收，常驻内存。


    function step(){
      var i = 1;
      return function(){
        i++
        return i
      }
    }

    var next = step()
    console.log(next());// 2
    console.log(next());// 3
    console.log(next());// 4
    console.log(next());// 5


    // 闭包优点：
    // 1. 延长了变量的声明周期
    // 2. 局部变量，避免全局变量的污染

    //  闭包缺点：
    // 1. 不能被及时回收，导致内存泄漏
    // 2. 内存泄漏，导致内存溢出
  </script>
</body>
</html>